/*
 * Matrix4.h
 *
 *  Created on: Jan 14, 2012
 *   
 */

#ifndef MATRIX4_H_ 
#define MATRIX4_H_


namespace Physics
{
	class Matrix4
	{
	private:
		float xx, xy, xz, xw;
		float yx, yy, yz, yw;
		float zx, zy, zz, zw;
		float wx, wy, wz, ww;
	
		// should it return the newly scaled matrix?
		// or just scale itself by void?
		// e.g: Matrix4 matrix;
		// matrix = matrix.Scale(3,3,3)
		// or
		// Matrix4 matrix;
		// matrix.Scale(3,3,3);  
		void Scale(float scaleX, float scaleY, float scaleZ);
		
	public:
		Matrix4();
		Matrix4( float XX, float XY, float XZ, float XW, 
			     float YX, float YY, float YZ, float YW,
			     float ZX, float ZY, float ZZ, float ZW,
			     float WX, float WY, float WZ, float WW);
		~Matrix4();
		void identity();

		float getIndex(int row, int col);
		Matrix4 operator +(Matrix4 &matrix);
		Matrix4 operator -(Matrix4 &matrix);
		Matrix4 operator *(Matrix4 &matrix);
		
		// calls Scale(x,y,z)
		void Scale(float scaleAmount);

		// should it return the newly translated matrix?
		// or just translate itself by void?
		// e.g: Same as Scale
		void Translate(float translateX, float translateY, float translateZ);

		void RotateX(float theta);

		void RotateY(float theta);

		void RotateZ(float theta);

	};
} /* NAMESPACE */

#endif /* MATRIX4_H_ */
